Add default widget handling to popovers
authorMatthias Clasen <mclasen@redhat.com>
Fri, 17 Apr 2015 04:10:06 +0000 (00:10 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 3 May 2015 00:34:28 +0000 (20:34 -0400)
Add a new API, gtk_popover_set_default_widget, that can be
used to make a widget act as default while the popover is
shown. This is useful in dialog-like popovers.

http://bugzilla.gnome.org/show_bug.cgi?id=747664

docs/reference/gtk/gtk3-sections.txt
gtk/gtkpopover.c
gtk/gtkpopover.h

index fb6ffd7d8121590cb37eef1c4c4afb1a74bb5658..8f15a3a0dacd1de6061d28bce882b29b555427da 100644 (file)
@@ -8062,6 +8062,8 @@ gtk_popover_set_modal
 gtk_popover_get_modal
 gtk_popover_set_transitions_enabled
 gtk_popover_get_transitions_enabled
+gtk_popover_set_default_widget
+gtk_popover_get_default_widget
 <SUBSECTION Standard>
 GTK_TYPE_POPOVER
 GTK_IS_POPOVER
index 88a083d094ed5e4d6e8593b890f2e18a12ba6c12..49d2fc2c4714bf6540ede216064bdb282a688d3a 100644 (file)
@@ -134,6 +134,8 @@ struct _GtkPopoverPrivate
   GtkWidget *widget;
   GtkWindow *window;
   GtkWidget *prev_focus_widget;
+  GtkWidget *default_widget;
+  GtkWidget *prev_default;
   GtkScrollable *parent_scrollable;
   GtkAdjustment *vadj;
   GtkAdjustment *hadj;
@@ -577,10 +579,17 @@ gtk_popover_set_state (GtkPopover *popover,
 static void
 gtk_popover_map (GtkWidget *widget)
 {
+  GtkPopoverPrivate *priv = GTK_POPOVER (widget)->priv;
+
+  priv->prev_default = gtk_window_get_default_widget (priv->window);
+  g_object_ref (priv->prev_default);
+
   GTK_WIDGET_CLASS (gtk_popover_parent_class)->map (widget);
 
   gdk_window_show (gtk_widget_get_window (widget));
   gtk_popover_update_position (GTK_POPOVER (widget));
+
+  gtk_window_set_default (priv->window, priv->default_widget);
 }
 
 static void
@@ -592,6 +601,9 @@ gtk_popover_unmap (GtkWidget *widget)
 
   gdk_window_hide (gtk_widget_get_window (widget));
   GTK_WIDGET_CLASS (gtk_popover_parent_class)->unmap (widget);
+
+  gtk_window_set_default (priv->window, priv->prev_default);
+  g_clear_object (&priv->prev_default);
 }
 
 static void
@@ -2357,3 +2369,60 @@ gtk_popover_new_from_model (GtkWidget  *relative_to,
 
   return popover;
 }
+
+/**
+ * gtk_popover_set_default_widget:
+ * @popover: a #GtkPopover
+ * @widget: (allow-none): the new default widget, or %NULL
+ *
+ * Sets the widget that should be set as default widget while
+ * the popover is shown (see gtk_window_set_default()). #GtkPopover
+ * remembers the previous default widget and reestablishes it
+ * when the popover is dismissed.
+ *
+ * Since: 3.18
+ */
+void
+gtk_popover_set_default_widget (GtkPopover *popover,
+                                GtkWidget  *widget)
+{
+  GtkPopoverPrivate *priv = popover->priv;
+
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+  g_return_if_fail (widget == NULL || gtk_widget_get_can_default (widget));
+
+  if (priv->default_widget == widget)
+    return;
+
+  if (priv->default_widget)
+    g_object_unref (priv->default_widget);
+
+  priv->default_widget = widget;
+
+  if (priv->default_widget)
+    g_object_ref (priv->default_widget);
+
+  if (gtk_widget_get_mapped (GTK_WIDGET (popover)))
+    gtk_window_set_default (priv->window, priv->default_widget);
+}
+
+/**
+ * gtk_popover_get_default_widget:
+ * @popover: a #GtkPopover
+ *
+ * Gets the widget that should be set as the default while
+ * the popover is shown.
+ *
+ * Returns: (transfer none): the default widget, or %NULL if there is none
+ *
+ * Since: 3.18
+ */
+GtkWidget *
+gtk_popover_get_default_widget (GtkPopover *popover)
+{
+  GtkPopoverPrivate *priv = popover->priv;
+
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+
+  return priv->default_widget;
+}
index 21c47fa744971100402658671e262ab2c6334455..f226bb2d4cc7ffdb1cac26c86ecb4f0bf171f1df 100644 (file)
@@ -103,6 +103,12 @@ void            gtk_popover_set_transitions_enabled (GtkPopover *popover,
 GDK_AVAILABLE_IN_3_16
 gboolean        gtk_popover_get_transitions_enabled (GtkPopover *popover);
 
+GDK_AVAILABLE_IN_3_18
+void            gtk_popover_set_default_widget (GtkPopover *popover,
+                                                GtkWidget  *widget);
+GDK_AVAILABLE_IN_3_18
+GtkWidget *     gtk_popover_get_default_widget (GtkPopover *popover);
+
 G_END_DECLS
 
 #endif /* __GTK_POPOVER_H__ */